import { readdirSync } from 'fs'
import { basePath, playlistMap } from './config'
import { PlayList, PlayListItem } from './type'
import { localeSort, writePlaylist } from './utils'

/**
 * 根据 rom 目录的文件创建游戏列表
 */
export async function createPlaylist({
  dirName,
  coreFile = '',
  coreName = '',
  listName = dirName
}: {
  /** 目录名称 */
  dirName: string
  /** 核心文件名 */
  coreFile: string
  /** 核心名称 */
  coreName: string
  /** 列表名称，未提供则与目录名称一致 */
  listName?: string
}) {
  // 读取目录文件
  const files = await readdirSync(`${basePath}/rom/${dirName}/`)

  const corePath = `.\\cores\\${coreFile}.dll`

  // 本地化中文排序列表
  const items = localeSort(files || []).map((file, index) => {
    // 游戏序号
    // const no = (index + 1 + '').padStart(3, 0)
    // 名称
    const name = (file as string).replace(/\.\S+$/g, '')

    return new PlayListItem({
      path: `.\\rom\\${dirName}\\${file}`,
      label: name, // `${no} ${name}`,
      core_path: corePath,
      core_name: coreName,
      db_name: dirName
    })
  })

  await writePlaylist(
    listName,
    new PlayList({
      default_core_path: corePath,
      default_core_name: coreName,
      items
    })
  )

  console.log('\n----------\n')
  console.log('\n【创建游戏列表】\n')

  const info = {
    游戏列表: `${listName}.lpl`,
    游戏目录: dirName,
    核心文件: `${coreFile}.dll`,
    核心名称: coreName,
    游戏数量: items.length
  }

  Object.entries(info).forEach(([label, value]) =>
    console.log(`[${label}] ${value}`)
  )

  if (items.length) {
    console.log('\n游戏列表：\n')

    console.log(
      items.map((item, index) => `${index + 1} ${item.label}`).join('\n')
    )
  }
}

/** 生成所有 */
export function createAll() {
  Object.entries(playlistMap).forEach(([dirName, options]) =>
    createPlaylist({ ...options, dirName })
  )
}

/** 根据目录生成 */
export function createByDir(dirName: keyof typeof playlistMap) {
  const options = playlistMap[dirName]
  if (!options) throw new Error('请输入正确的目录名称')

  createPlaylist({ ...options, dirName })
}
